二維幾何-多邊形

如何計算多邊形的有向面積?如果多邊形是凸的,可以從第一個頂點出發把凸多邊形分成n-2個三角形,然後把面積加起來。

double ConvexPolygonArea(Point *p, int n)
{
    double area;
    int i;

    area = 0;
    for(i = 1; i < n-1; i++)
        area += Cross(p[i]-p[0], p[i+1]-p[0]);

    return area / 2;
}

其實這個方法對非凸多邊形也適用。由於三角形面積是有向的,在外面的部分可以正負抵消掉。實際上,可以以任意點出發進行劃分。

可以取p[0]點爲劃分頂點,一方面可以少算兩個叉積(0和任意向量的叉積都等於0),另一方面也減少乘法溢出的可能性,還不用特殊處理(i=n-1的時候,下一個頂點是p[0]而不是p[n],因爲p[n]不存在)。

double PolygonArea(Point *p, int n)
{
    double area;
    int i;

    area = 0;
    for(i = 1; i < n-1; i++)
        area += Cross(p[i]-p[0], p[i+1]-p[0]);

    return area / 2;
}

圓與凸多邊形的公共面積。把凸多邊形的每條邊與圓判斷關係,如果邊的兩點都在圓內,包括邊界,兩條邊對應一個三角形的面積。如果一個點在圓外一個在圓內,則是一個三角形加一個扇形。兩點都在圓外和圓有兩個交點是兩個扇形和一個三角形,無交點是一個扇形。

double CircleIntersectPolygon(Point *P, int n, Circle C)
{
    double area, t1, t2;
    int i, num;

    area = 0;
    for(i = 0; i < n; i++)
    {
        if(InCircle(P[i], C) && InCircle(P[(i+1)%n], C))
            area += Area(P[i], P[(i+1)%n], C.c);
        else
        {
            vector<Point> sol;
            num = getSegmentCircleIntersection(P[i], P[(i+1)%n], C, t1, t2, sol);
            if(InCircle(P[i], C))
            {
                area += Area(P[i], C.c, sol[1]);
                area += arcArea(sol[1], P[(i+1)%n], C.r);
            }
            else if(InCircle(P[(i+1)%n], C))
            {
                area += Area(P[(i+1)%n], C.c, sol[0]);
                area += arcArea(sol[0], P[i], C.r);
            }
            else
            {
                if(num == 2)
                {
                    area += Area(sol[0], sol[1], C.c);
                    area += arcArea(P[i], sol[0], C.r);
                    area += arcArea(P[(i+1)%n], sol[1], C.r);
                }
                else
                    area += arcArea(P[i], P[(i+1)%n], C.r);
            }
        }
    }

    return area;
}

 

 

正n邊形的面積:

S=1/2*n*R*R*sina

R爲多邊形外接圓半徑,a爲各邊所對圓心角。

n邊形內角和:180度 * (n-2).

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章